/*
@Time : 2019/8/26 0026 16:06
@Author : visons
*/
package main

import (
	"fmt"
	"github.com/go-redis/redis"
)

func ListTest(client *redis.Client) {
	/**
	rpush(key, value)：
	将一个或多个值 value 插入到列表 key 的表尾(最右边)。
	如果有多个 value 值，那么各个 value 值按从左到右的顺序依次插入到表尾：比如对一个空列表 mylist 执行 RPUSH mylist a b c ，得出的结果列表为 a b c ，等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
	如果 key 不存在，一个空列表会被创建并执行 RPUSH 操作。
	当 key 存在但不是列表类型时，返回一个错误。
	*/
	length, err := client.RPush("list1", "a", "b", "c").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(length)

	/**
	lpush(key, value)：
	将一个或多个值 value 插入到列表 key 的表头
	如果有多个 value 值，那么各个 value 值按从左到右的顺序依次插入到表头： 比如说，对空列表 mylist 执行命令 LPUSH mylist a b c ，列表的值将是 c b a ，这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
	如果 key 不存在，一个空列表会被创建并执行 LPUSH 操作。
	当 key 存在但不是列表类型时，返回一个错误。
	*/
	length, err = client.RPush("list1", "d").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(length)

	//llen(key)：返回名称为key的list的长度。
	length, err = client.LLen("list1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(length)

	/**
	lrange(key, start, end)：
	返回列表 key 中指定区间内的元素，区间以偏移量 start 和 stop 指定。
	下标(index)参数 start 和 stop 都以 0 为底，也就是说，以 0 表示列表的第一个元素，以 1 表示列表的第二个元素，以此类推。
	你也可以使用负数下标，以 -1 表示列表的最后一个元素， -2 表示列表的倒数第二个元素，以此类推。
	*/
	results, err := client.LRange("list1", 0, 100).Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(results)

	/**
	对一个列表进行修剪(trim)，就是说，让列表只保留指定区间内的元素，不在指定区间之内的元素都将被删除。
	举个例子，执行命令 LTRIM list 0 2 ，表示只保留列表 list 的前三个元素，其余元素全部删除。
	下标(index)参数 start 和 stop 都以 0 为底，也就是说，以 0 表示列表的第一个元素，以 1 表示列表的第二个元素，以此类推。
	你也可以使用负数下标，以 -1 表示列表的最后一个元素， -2 表示列表的倒数第二个元素，以此类推。
	当 key 不是列表类型时，返回一个错误。
	*/
	result, err := client.LTrim("list1", 2, 4).Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(result)

	//lindex(key, index)：返回名称为key的list中index位置的元素。
	cmd, err := client.LIndex("list1", 1).Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(cmd)

	//lset(key, index, value)：给名称为key的list中index位置的元素赋值。
	result, err = client.LSet("list1", 1, "world").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(result)

	//lpop(key)：返回并删除名称为key的list中的首元素。
	result, err = client.LPop("list1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(result)

	//rpop(key)：返回并删除名称为key的list中的尾元素。
	result, err = client.RPop("list1").Result()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(result)

}
